package com.songzhili.nohttpdemo.base;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.songzhili.nohttpdemo.api.CallServer;
import com.songzhili.nohttpdemo.api.HttpResponseListener;
import com.songzhili.nohttpdemo.api.HttpResponseCallBackListener;
import com.yanzhenjie.nohttp.NoHttp;
import com.yanzhenjie.nohttp.rest.Request;
import com.yanzhenjie.nohttp.rest.RequestQueue;

/**
 * Created by Administrator on 2018/1/4 0004.
 */

public abstract class BaseActivity extends AppCompatActivity{
    /**
     * 请求队列。
     */
    private RequestQueue mQueue;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentView());

        // 初始化请求队列，传入的参数是请求并发值。
        mQueue = NoHttp.newRequestQueue(1);
        initView();
        initData();
    }
    /**
     * 用来标记取消。
     */
    private Object object = new Object();
    public abstract int getContentView();

    protected abstract void initView();
    public abstract void initData();
    /**
     * 发起请求。
     *
     * @param what      what.
     * @param request   请求对象。
     * @param callback  回调函数。
     * @param canCancel 是否能被用户取消。
     * @param isLoading 实现显示加载框。
     * @param <T>       想请求到的数据类型。
     */
    public <T> void request(int what, Request<T> request, HttpResponseCallBackListener<T> callback,
                            boolean canCancel, boolean isLoading) {
        request.setCancelSign(object);
        mQueue.add(what, request, new HttpResponseListener<>(request,callback,this, canCancel, isLoading));
    }
    @Override
    protected void onDestroy() {
        // 和声明周期绑定，退出时取消这个队列中的所有请求，当然可以在你想取消的时候取消也可以，不一定和声明周期绑定。
        mQueue.cancelBySign(object);

        // 因为回调函数持有了activity，所以退出activity时请停止队列。
        mQueue.stop();
        CallServer.getInstance().stop();
        super.onDestroy();
    }
}
